home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Emulators / v2600 / Source.lha / Source / c2p_020_fastram2.a < prev    next >
Text File  |  1997-01-29  |  7KB  |  281 lines

  1. ; Chunky2Planar algorithm. [writes pipelined a little]
  2. ;
  3. ;     Cpu only solution
  4. ;    Optimised for 020+fastram
  5. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  6.  
  7. ;    output    five_pass.o
  8. ;    opt    l+    ;Linkable code
  9. ;    opt    c+    ;Case sensitive
  10. ;    opt    d-    ;No debugging information
  11. ;    opt    m+    ;Expand macros in listing
  12. ;    opt    o-    ;No optimisation
  13.     
  14.     xdef    _chunky2planar
  15.         
  16. ;  a0 -> chunky pixels
  17. ;  a1 -> plane0
  18.  
  19.    section text,code
  20.  
  21. width        equ    320        ; must be multiple of 32
  22. height        equ    200
  23. plsiz        equ    (width/8)*height
  24.  
  25. _chunky2planar:
  26.         ;a0 = chunky buffer
  27.         ;a1 = first bitplane
  28.         
  29.     movem.l    d2-d7/a2-a6,-(sp)
  30.     move.l    a0,a2
  31.     add.l    #plsiz*8,a2    ;a2 = end of chunky buffer
  32.     
  33.     ;; Sweep thru the whole chunky data once,
  34.     ;; Performing 3 merge operations on it.
  35.     
  36.     move.l    #$00ff00ff,a3    ; load byte merge mask
  37.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  38.     
  39. firstsweep
  40.  movem.l (a0),d0-d7      ;8+4n   40      cycles
  41.  move.l  d4,a6           a6 = CD
  42.  move.w  d0,d4           d4 = CB
  43.  swap    d4              d4 = BC
  44.  move.w  d4,d0           d0 = AC
  45.  move.w  a6,d4           d4 = BD
  46.  move.l  d5,a6           a6 = CD
  47.  move.w  d1,d5           d5 = CB
  48.  swap    d5              d5 = BC
  49.  move.w  d5,d1           d1 = AC
  50.  move.w  a6,d5           d5 = BD
  51.  move.l  d6,a6           a6 = CD
  52.  move.w  d2,d6           d6 = CB
  53.  swap    d6              d6 = BC
  54.  move.w  d6,d2           d2 = AC
  55.  move.w  a6,d6           d6 = BD
  56.  move.l  d7,a6           a6 = CD
  57.  move.w  d3,d7           d7 = CB
  58.  swap    d7              d7 = BC
  59.  move.w  d7,d3           d3 = AC
  60.  move.w  a6,d7           d7 = BD
  61.  move.l  d7,a6
  62.  move.l  d6,a5
  63.  move.l  a3,d6   ; d6 = 0x0x
  64.  move.l  a3,d7   ; d7 = 0x0x
  65.  and.l   d0,d6   ; d6 = 0b0r
  66.  and.l   d2,d7   ; d7 = 0j0z
  67.  eor.l   d6,d0   ; d0 = a0q0
  68.  eor.l   d7,d2   ; d2 = i0y0
  69.  lsl.l   #8,d6   ; d6 = b0r0
  70.  lsr.l   #8,d2   ; d2 = 0i0y
  71.  or.l    d2,d0           ; d0 = aiqy
  72.  or.l    d7,d6           ; d2 = bjrz
  73.  move.l  a3,d7   ; d7 = 0x0x
  74.  move.l  a3,d2   ; d2 = 0x0x
  75.  and.l   d1,d7   ; d7 = 0b0r
  76.  and.l   d3,d2   ; d2 = 0j0z
  77.  eor.l   d7,d1   ; d1 = a0q0
  78.  eor.l   d2,d3   ; d3 = i0y0
  79.  lsl.l   #8,d7   ; d7 = b0r0
  80.  lsr.l   #8,d3   ; d3 = 0i0y
  81.  or.l    d3,d1           ; d1 = aiqy
  82.  or.l    d2,d7           ; d3 = bjrz
  83.  
  84.  move.l  a4,d2   ; d2 = 0x0x
  85.  move.l  a4,d3   ; d3 = 0x0x
  86.  and.l   d0,d2   ; d2 = 0b0r
  87.  and.l   d1,d3   ; d3 = 0j0z
  88.  eor.l   d2,d0   ; d0 = a0q0
  89.  eor.l   d3,d1   ; d1 = i0y0
  90.  lsr.l   #4,d1   ; d1 = 0i0y
  91.  or.l    d1,d0           ; d0 = aiqy
  92.  move.l  d0,(a0)+
  93.  lsl.l    #4,d2
  94.  or.l    d3,d2           ; d1 = bjrz
  95.  move.l    d2,(a0)+
  96.  
  97.  move.l  a4,d3   ; d3 = 0x0x
  98.  move.l  a4,d1   ; d1 = 0x0x
  99.  and.l   d6,d3   ; d3 = 0b0r
  100.  and.l   d7,d1   ; d1 = 0j0z
  101.  eor.l   d3,d6   ; d6 = a0q0
  102.  eor.l   d1,d7   ; d7 = i0y0
  103.  lsr.l   #4,d7   ; d7 = 0i0y
  104.  or.l    d7,d6           ; d6 = aiqy
  105.  move.l    d6,(a0)+
  106.  lsl.l    #4,d3
  107.  or.l    d1,d3           ; d7 = bjrz
  108.  move.l    d3,(a0)+
  109.  
  110. ; move.l  d0,(a0)+
  111. ; move.l  d2,(a0)+
  112. ; move.l  d6,(a0)+
  113. ; move.l  d3,(a0)+
  114.  move.l  a6,d7
  115.  move.l  a5,d6
  116.  move.l  a3,d0   ; d0 = 0x0x
  117.  move.l  a3,d1   ; d1 = 0x0x
  118.  and.l   d4,d0   ; d0 = 0b0r
  119.  and.l   d6,d1   ; d1 = 0j0z
  120.  eor.l   d0,d4   ; d4 = a0q0
  121.  eor.l   d1,d6   ; d6 = i0y0
  122.  lsl.l   #8,d0   ; d0 = b0r0
  123.  lsr.l   #8,d6   ; d6 = 0i0y
  124.  or.l    d6,d4           ; d4 = aiqy
  125.  or.l    d1,d0           ; d6 = bjrz
  126.  move.l  a3,d1   ; d1 = 0x0x
  127.  move.l  a3,d6   ; d6 = 0x0x
  128.  and.l   d5,d1   ; d1 = 0b0r
  129.  and.l   d7,d6   ; d6 = 0j0z
  130.  eor.l   d1,d5   ; d5 = a0q0
  131.  eor.l   d6,d7   ; d7 = i0y0
  132.  lsl.l   #8,d1   ; d1 = b0r0
  133.  lsr.l   #8,d7   ; d7 = 0i0y
  134.  or.l    d7,d5           ; d5 = aiqy
  135.  or.l    d6,d1           ; d7 = bjrz
  136.  move.l  a4,d6   ; d6 = 0x0x
  137.  move.l  a4,d7   ; d7 = 0x0x
  138.  and.l   d4,d6   ; d6 = 0b0r
  139.  and.l   d5,d7   ; d7 = 0j0z
  140.  eor.l   d6,d4   ; d4 = a0q0
  141.  eor.l   d7,d5   ; d5 = i0y0
  142.  lsr.l   #4,d5   ; d5 = 0i0y
  143.  or.l    d5,d4           ; d4 = aiqy
  144.  move.l  d4,(a0)+
  145.  lsl.l   #4,d6   ; d6 = b0r0
  146.  or.l    d7,d6           ; d5 = bjrz
  147.  move.l  d6,(a0)+
  148.  
  149.  move.l  a4,d7   ; d7 = 0x0x
  150.  move.l  a4,d5   ; d5 = 0x0x
  151.  and.l   d0,d7   ; d7 = 0b0r
  152.  and.l   d1,d5   ; d5 = 0j0z
  153.  eor.l   d7,d0   ; d0 = a0q0
  154.  eor.l   d5,d1   ; d1 = i0y0
  155.  lsr.l   #4,d1   ; d1 = 0i0y
  156.  or.l    d1,d0           ; d0 = aiqy
  157.  move.l  d0,(a0)+
  158.  lsl.l   #4,d7   ; d7 = b0r0
  159.  or.l    d5,d7           ; d1 = bjrz
  160.  move.l  d7,(a0)+
  161.  cmp.l   a0,a2           ;; 4c
  162.  bne.w   firstsweep      ;; 6c
  163.  
  164.  sub.l   #plsiz*8,a0
  165.  move.l  #$33333333,a5
  166.  move.l  #$55555555,a6
  167.  lea     plsiz*4(a1),a1  ;a2 = plane4
  168.  
  169. secondsweep
  170.  move.l  (a0),d0
  171.  move.l  8(a0),d1
  172.  move.l  16(a0),d2
  173.  move.l  24(a0),d3
  174.  
  175.  move.l  a5,d6   ; d6 = 0x0x
  176.  move.l  a5,d7   ; d7 = 0x0x
  177.  and.l   d0,d6   ; d6 = 0b0r
  178.  and.l   d2,d7   ; d7 = 0j0z
  179.  eor.l   d6,d0   ; d0 = a0q0
  180.  eor.l   d7,d2   ; d2 = i0y0
  181.  lsl.l   #2,d6   ; d6 = b0r0
  182.  lsr.l   #2,d2   ; d2 = 0i0y
  183.  or.l    d2,d0           ; d0 = aiqy
  184.  or.l    d7,d6           ; d2 = bjrz
  185.  move.l  a5,d7   ; d7 = 0x0x
  186.  move.l  a5,d2   ; d2 = 0x0x
  187.  and.l   d1,d7   ; d7 = 0b0r
  188.  and.l   d3,d2   ; d2 = 0j0z
  189.  eor.l   d7,d1   ; d1 = a0q0
  190.  eor.l   d2,d3   ; d3 = i0y0
  191.  lsl.l   #2,d7   ; d7 = b0r0
  192.  lsr.l   #2,d3   ; d3 = 0i0y
  193.  or.l    d3,d1           ; d1 = aiqy
  194.  or.l    d2,d7           ; d3 = bjrz
  195.  move.l  a6,d2   ; d2 = 0x0x
  196.  move.l  a6,d3   ; d3 = 0x0x
  197.  and.l   d0,d2   ; d2 = 0b0r
  198.  and.l   d1,d3   ; d3 = 0j0z
  199.  eor.l   d2,d0   ; d0 = a0q0
  200.  eor.l   d3,d1   ; d1 = i0y0
  201.  lsr.l   #1,d1   ; d1 = 0i0y
  202.  or.l    d1,d0           ; d0 = aiqy
  203.  move.l  d0,plsiz*3(a1)
  204.  add.l   d2,d2
  205.  or.l    d3,d2           ; d1 = bjrz
  206.  move.l  d2,plsiz*2(a1)
  207.  
  208.  move.l  a6,d3   ; d3 = 0x0x
  209.  move.l  a6,d1   ; d1 = 0x0x
  210.  and.l   d6,d3   ; d3 = 0b0r
  211.  and.l   d7,d1   ; d1 = 0j0z
  212.  eor.l   d3,d6   ; d6 = a0q0
  213.  eor.l   d1,d7   ; d7 = i0y0
  214.  lsr.l   #1,d7   ; d7 = 0i0y
  215.  or.l    d7,d6           ; d6 = aiqy
  216.  move.l  d6,plsiz*1(a1)
  217.  add.l   d3,d3
  218.  or.l    d1,d3           ; d7 = bjrz
  219.  move.l  d3,(a1)+
  220.  
  221.  move.l  4(a0),d0
  222.  move.l  12(a0),d1
  223.  move.l  20(a0),d2
  224.  move.l  28(a0),d3
  225.  
  226.  move.l  a5,d6   ; d6 = 0x0x
  227.  move.l  a5,d7   ; d7 = 0x0x
  228.  and.l   d0,d6   ; d6 = 0b0r
  229.  and.l   d2,d7   ; d7 = 0j0z
  230.  eor.l   d6,d0   ; d0 = a0q0
  231.  eor.l   d7,d2   ; d2 = i0y0
  232.  lsl.l   #2,d6   ; d6 = b0r0
  233.  lsr.l   #2,d2   ; d2 = 0i0y
  234.  or.l    d2,d0           ; d0 = aiqy
  235.  or.l    d7,d6           ; d2 = bjrz
  236.  move.l  a5,d7   ; d7 = 0x0x
  237.  move.l  a5,d2   ; d2 = 0x0x
  238.  and.l   d1,d7   ; d7 = 0b0r
  239.  and.l   d3,d2   ; d2 = 0j0z
  240.  eor.l   d7,d1   ; d1 = a0q0
  241.  eor.l   d2,d3   ; d3 = i0y0
  242.  lsl.l   #2,d7   ; d7 = b0r0
  243.  lsr.l   #2,d3   ; d3 = 0i0y
  244.  or.l    d3,d1           ; d1 = aiqy
  245.  or.l    d2,d7           ; d3 = bjrz
  246.  move.l  a6,d2   ; d2 = 0x0x
  247.  move.l  a6,d3   ; d3 = 0x0x
  248.  and.l   d0,d2   ; d2 = 0b0r
  249.  and.l   d1,d3   ; d3 = 0j0z
  250.  eor.l   d2,d0   ; d0 = a0q0
  251.  eor.l   d3,d1   ; d1 = i0y0
  252.  lsr.l   #1,d1   ; d1 = 0i0y
  253.  or.l    d1,d0           ; d0 = aiqy
  254.  move.l  d0,-4-plsiz*1(a1)
  255.  add.l   d2,d2
  256.  or.l    d3,d2           ; d1 = bjrz
  257.  move.l  d2,-4-plsiz*2(a1)
  258.  
  259.  move.l  a6,d3   ; d3 = 0x0x
  260.  move.l  a6,d1   ; d1 = 0x0x
  261.  and.l   d6,d3   ; d3 = 0b0r
  262.  and.l   d7,d1   ; d1 = 0j0z
  263.  eor.l   d3,d6   ; d6 = a0q0
  264.  eor.l   d1,d7   ; d7 = i0y0
  265.  lsr.l   #1,d7   ; d7 = 0i0y
  266.  or.l    d7,d6           ; d6 = aiqy
  267.  move.l  d6,-4-plsiz*3(a1)
  268.  add.l   d3,d3
  269.  or.l    d1,d3           ; d7 = bjrz
  270.  move.l  d3,-4-plsiz*4(a1)
  271.  add.w   #32,a0  ;;4c
  272.  cmp.l   a0,a2   ;;4c
  273.  bne.w   secondsweep     ;;6c
  274.  
  275.     ;300
  276.     
  277. exit    
  278.     movem.l    (sp)+,d2-d7/a2-a6
  279.     rts
  280.     end
  281.